home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 334_01 / command2.c < prev    next >
Text File  |  1991-02-04  |  28KB  |  1,067 lines

  1. /*
  2.  *
  3.  *    gnutex/gnuplot translator  --  command.c
  4.  *
  5.  * By David Kotz, 1990.
  6.  * Department of Computer Science, Duke University, Durham, NC 27706.
  7.  * Mail to dfk@cs.duke.edu.
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <math.h>
  12. #include "plot.h"
  13.  
  14. #ifndef STDOUT
  15. #define STDOUT 1
  16. #endif
  17.  
  18. extern char *malloc();
  19.  
  20. /*
  21.  * global variables to hold status of 'set' options
  22.  *
  23.  */
  24. BOOLEAN            autoscale_x = TRUE;
  25. BOOLEAN            autoscale_y = TRUE;
  26. BOOLEAN            autoscale_lx = TRUE; /* local to this plot */
  27. BOOLEAN            autoscale_ly = TRUE; /* local to this plot */
  28. enum PLOT_STYLE data_style    = POINTS,
  29.                 func_style    = LINES;
  30. BOOLEAN            log_x        = FALSE,
  31.                 log_y        = FALSE;
  32. FILE*            infile;
  33. FILE*            outfile;
  34. char            outstr[MAX_ID_LEN+1] = "STDOUT";
  35. int                samples        = SAMPLES;
  36. int                term        = 0;                /* unknown term is 0 */
  37. double            xmin        = -10,
  38.                 xmax        = 10,
  39.                 ymin        = -10,
  40.                 ymax        = 10;
  41. double            zero = ZERO;            /* zero threshold, not 0! */
  42.  
  43. BOOLEAN xtics = TRUE;
  44. BOOLEAN ytics = TRUE;
  45.  
  46. BOOLEAN clipping = TRUE;
  47.  
  48. BOOLEAN undefined;
  49.  
  50. char title_string[MAX_LINE_LEN] = "";
  51. char xlabel_string[MAX_LINE_LEN] = "";
  52. char ylabel_string[MAX_LINE_LEN] = "";
  53. char xformat[MAX_ID_LEN] = "";
  54. char yformat[MAX_ID_LEN] = "";
  55. int y_skip_factor = 0;
  56. double plot_width = 4;        /* width  in inches, for latex */
  57. double plot_height = 3;        /* height in inches, for latex */
  58.  
  59. /*
  60.  * instead of <strings.h>
  61.  */
  62.  
  63. char *gets(),*getenv();
  64. char *strcpy(),*strcat();
  65.  
  66. double magnitude(),angle(),real(),imag();
  67. struct value *const_express(), *pop(), *complex();
  68.  
  69.  
  70. extern struct vt_entry vt[];
  71. extern struct st_entry st[];
  72. extern struct udft_entry udft[];
  73.  
  74. extern int inline;            /* line number of current input line */
  75. char input_line[MAX_LINE_LEN],dummy_var[MAX_ID_LEN + 1];
  76. struct at_type *curr_at;
  77. int c_token;
  78. int next_value = (int)NEXT_VALUE,next_function = 0,c_function = 0;
  79. int num_tokens;
  80.  
  81. struct curve_points plot[MAX_PLOTS];
  82. int plot_count = 0;
  83. char plot_ranges[MAX_LINE_LEN+1];
  84. BOOLEAN pending_plot = FALSE;    /* TRUE if a plot command is pending output */
  85. int plot_line;                /* input line number of pending plot */
  86. BOOLEAN key_on = TRUE;        /* will a key be displayed */
  87. BOOLEAN plot_key = FALSE;    /* did we want a key for this plot? */
  88. BOOLEAN label_on = FALSE;    /* will labels be displayed */
  89. BOOLEAN arrow_on = FALSE;    /* will arrows be displayed */
  90. BOOLEAN plot_label = FALSE;    /* do we want labels displayed? */
  91. BOOLEAN plot_arrow = FALSE;    /* do we want arrows displayed? */
  92. BOOLEAN plot_format = FALSE;    /* have we seen a set format? */
  93.  
  94. BOOLEAN was_output;            /* was there any output from command? */
  95.  
  96. int inline = 0;            /* input line number */
  97.  
  98. com_line()
  99. {
  100.     read_line();
  101.  
  102. #ifdef vms
  103.     if (input_line[0] == '!' || input_line[0] == '$')
  104.      fprintf(outfile, "%s\n", input_line);
  105.     else
  106.       do_line();
  107. #else /* vms */
  108.     if (input_line[0] == '!')
  109.      fprintf(outfile, "%s\n", input_line);
  110.     else
  111.       do_line();
  112. #endif
  113.  
  114. }
  115.  
  116. /* Read a line of input; much simplified by the fact that infile is 
  117.  * never a terminal. Handles line continuation and EOF.
  118.  */
  119. read_line()
  120. {
  121.     int len, left;
  122.     int start = 0;
  123.     BOOLEAN more, stop;
  124.     int last;
  125.  
  126.     /* read one command */
  127.     left = MAX_LINE_LEN;
  128.     start = 0;
  129.     more = TRUE;
  130.     stop = FALSE;
  131.  
  132.     while (more) {
  133.        if (fgets(&(input_line[start]), left, infile) == NULL) {
  134.           stop = TRUE;        /* EOF in file */
  135.           input_line[start] = '\0';
  136.           more = FALSE;    
  137.        } else {
  138.           inline++;
  139.           len = strlen(input_line) - 1;
  140.           if (input_line[len] == '\n') { /* remove any newline */
  141.              input_line[len] = '\0';
  142.              len--;
  143.           } else if (len+1 >= left)
  144.             int_error("Input line too long",NO_CARET);
  145.                  
  146.           if (input_line[len] == '\\') { /* line continuation */
  147.              start = len;
  148.              left -= len;
  149.           } else
  150.             more = FALSE;
  151.        }
  152.     }
  153.  
  154.     if (stop && input_line[0] == '\0')
  155.      done(0);
  156. }
  157.  
  158. do_line()
  159. {
  160.     extern int comment_pos;    /* from scanner */
  161.     BOOLEAN nonempty;        /* TRUE if output was nonempty */
  162.  
  163.     num_tokens = scanner(input_line);
  164.     c_token = 0;
  165.     nonempty = FALSE;
  166.     while(c_token < num_tokens) {
  167.        was_output = FALSE;
  168.  
  169.        command();            /* parse the next command */
  170.  
  171.        if (c_token < num_tokens) /* something after command */
  172.         if (equals(c_token,";")) {
  173.             c_token++;
  174.             if (was_output)
  175.              fprintf(outfile, "; ");
  176.         } else
  177.           int_error("';' expected",c_token);
  178.        nonempty = was_output || nonempty;
  179.     }
  180.  
  181.     /* write out any comment */
  182.     if (comment_pos >= 0) {
  183.        if (nonempty)
  184.         putc(' ', outfile);
  185.        fputs(input_line+comment_pos, outfile);
  186.        nonempty = TRUE;
  187.     }
  188.     if (nonempty || num_tokens == 0)
  189.      putc('\n', outfile);
  190. }
  191.  
  192.  
  193. command()
  194. {
  195.     int start_token = c_token;
  196.  
  197.     if (is_definition(c_token)) {
  198.        define();
  199.        copy_command(start_token, c_token-1);
  200.     }
  201.     else if (almost_equals(c_token,"h$elp") || equals(c_token,"?")) {
  202.        c_token++;
  203.        while (!(END_OF_COMMAND))
  204.         c_token++;
  205.        err_msg("help command ignored (removed)");
  206.     }
  207.     else if (almost_equals(c_token,"pr$int")) {
  208.        struct value a;
  209.        c_token++;
  210.        (void) const_express(&a);
  211.        copy_command(start_token, c_token-1);
  212.     }
  213.     else if (almost_equals(c_token,"p$lot")) {
  214.        if (pending_plot)
  215.         write_plot();
  216.        c_token++;
  217.        plotrequest();
  218.        pending_plot = TRUE;
  219.        plot_line = inline;
  220.        /* we defer output until eof or next plot command */
  221.     }
  222.     else if (almost_equals(c_token,"la$bel")) {
  223.        c_token++;
  224.        labelrequest();
  225.     }
  226.     else if (almost_equals(c_token,"k$ey")) {
  227.        c_token++;
  228.        keyrequest();
  229.     }
  230.     else if (almost_equals(c_token,"se$t")) {
  231.        c_token++;
  232.        if (almost_equals(c_token,"t$erminal")) {
  233.           c_token++;
  234.           if (!END_OF_COMMAND)
  235.             c_token++;
  236.           copy_command(start_token, c_token-1);
  237.        }
  238.        else if (almost_equals(c_token,"sa$mples")) {
  239.           struct value a;
  240.           c_token++;
  241.           (void)magnitude(const_express(&a));
  242.           copy_command(start_token, c_token-1);
  243.        }
  244.        else if (almost_equals(c_token,"o$utput")) {
  245.           c_token++;
  246.           if (!END_OF_COMMAND) { /* no file specified */
  247.              if (!isstring(c_token)) 
  248.                int_error("expecting filename",c_token);
  249.              else
  250.                c_token++;
  251.           }
  252.           copy_command(start_token, c_token-1);
  253.        }
  254.        else if (almost_equals(c_token,"a$utoscale")) {
  255.           c_token++;
  256.           if (END_OF_COMMAND) {
  257.           } else if (equals(c_token, "xy") || equals(c_token, "yx")) {
  258.              c_token++;
  259.           } else if (equals(c_token, "x")) {
  260.              c_token++;
  261.           } else if (equals(c_token, "y")) {
  262.              c_token++;
  263.           } else
  264.             int_error("expecting axes specification", c_token);
  265.           copy_command(start_token, c_token-1);
  266.        } 
  267.        else if (almost_equals(c_token,"noa$utoscale")) {
  268.           c_token++;
  269.           if (END_OF_COMMAND) {
  270.           } else if (equals(c_token, "xy") || equals(c_token, "yx")) {
  271.              c_token++;
  272.           } else if (equals(c_token, "x")) {
  273.              c_token++;
  274.           } else if (equals(c_token, "y")) {
  275.              c_token++;
  276.           } else
  277.             int_error("expecting axes specification", c_token);
  278.           copy_command(start_token, c_token-1);
  279.        } 
  280.        else if (almost_equals(c_token,"l$ogscale")) {
  281.           c_token++;
  282.           if (equals(c_token,"x")) {
  283.              c_token++;
  284.           } else if (equals(c_token,"y")) {
  285.              c_token++;
  286.           } else if (equals(c_token,"xy") || equals(c_token,"yx")) {
  287.              c_token++;
  288.           } else
  289.             int_error("expecting 'x', 'y', or 'xy'", c_token);
  290.           copy_command(start_token, c_token-1);
  291.        }
  292.        else if (almost_equals(c_token,"nol$ogscale")) {
  293.           copy_command(start_token, c_token++);
  294.        }
  295.        else if (almost_equals(c_token,"z$ero")) {
  296.           struct value a;
  297.           c_token++;
  298.           (void) magnitude(const_express(&a)); 
  299.           copy_command(start_token, c_token-1);
  300.        }
  301.        else if (almost_equals(c_token,"x$range")) {
  302.           c_token++;
  303.           if (!equals(c_token,"["))
  304.             int_error("expecting '['",c_token);
  305.           c_token++;
  306.           load_range();
  307.           if (!equals(c_token,"]"))
  308.             int_error("expecting ']'",c_token);
  309.           c_token++;
  310.           copy_command(start_token, c_token-1);
  311.        }
  312.        else if (almost_equals(c_toke